#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

typedef void (*handler_t)();

// 方法集
vector<handler_t> handlers;

void fun1()
{
    printf("hello, 我是方法1\n");
}

void fun2()
{
    printf("hello, 我是方法2\n");
}

void Load()
{
    handlers.push_back(fun1);
    handlers.push_back(fun2);
}

int main()
{
    pid_t id = fork();
    int cnt = 5;
    if(id < 0)
    {
        printf("创建子进程失败\n");
        exit(1);
    }
    
    if(id == 0)
    {
        // 子进程
        while(cnt--)
        {
            printf("我是子进程: %d, 我的父进程: %d\n", getpid(), getppid());
            sleep(3);
        }

        exit(104);
    }
    else
    {
        // 父进程
        int status = 0;
        while(1)
        {
            int ret = waitpid(id, &status, WNOHANG);
            if(ret > 0)
            {
                if(WIFEXITED(status))
                {
                    printf("等待成功，%d, 进程正常退出, exit code: %d\n", ret, WEXITSTATUS(status));
                }
                else
                {
                    printf("进程异常退出\n");
                }
            }
            else if(ret == 0)
            {
                printf("子进程没结束, 我父进程就去做其它事情了...\n");
                if(handlers.empty()) Load();

                for(auto f : handlers)
                {
                    f();
                }

                sleep(1);
            }
            else
            {
                // 出错
            }
        }
    }


    return 0;
}